home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Libraries / SAT 2.3.8 / Demos / HeartQuest demo ƒ / sHeart.p < prev    next >
Text File  |  1995-01-16  |  4KB  |  175 lines

  1. {===============================================}
  2. {================= Heart sprite unit ================}
  3. {===============================================}
  4.  
  5. { Example file for Ingemars Sprite Animation Toolkit. }
  6. { © Ingemar Ragnemalm 1992 }
  7. { See doc files for legal terms for using this code. }
  8.  
  9. unit sHeart;
  10.  
  11. { Sprite unit. A sprite unit should include the following routines:}
  12. { Init-procedure, that initializes private bitmaps}
  13. { Setup-procedure, that sets variables other than the standard ones set by MakeSprite }
  14. { Handle-procedure, to be called once per iteration until the sprite dies }
  15. { Hittask-procedure (optional), for advanced collission handling. }
  16.  
  17. interface
  18.  
  19.     uses
  20. {$IFC UNDEFINED THINK_PASCAL}
  21.         Types, Quickdraw, 
  22. {$ENDC}
  23.         SAT, scores, sBonus, SoundConst, GameGlobals;
  24.  
  25.     procedure InitHeart;
  26.     procedure SetupHeart (mp: SpritePtr);
  27.     procedure SetupBonusHeart (mp: SpritePtr);
  28.  
  29. implementation
  30.  
  31.     var
  32.         heartFace: array[1..4] of FacePtr;
  33.         sofar: integer;
  34.  
  35.     procedure InitHeart;
  36.         var
  37.             ii: integer;
  38.     begin
  39.         for ii := 1 to 4 do
  40.             heartFace[ii] := SATGetFace(135 + ii);
  41.     end;
  42.  
  43.     procedure HandleHeart (me: SpritePtr);
  44.         var
  45.             mp: SpritePtr;
  46.     begin
  47.         if me^.kind <> -2 then
  48.             begin
  49.                 me^.task := nil;
  50.                 AddScore(10);
  51.                 SATSoundPlay(PlinkSndH, 1, false);
  52.                 sofar := sofar + 1;
  53.  
  54.                 if sofar mod 5 = 0 then
  55.                     if SATRand(10) < 5 then
  56.                         mp := SATNewSprite(-4, -31, SATRand(gSAT.offSizeV - 64) + 32, @SetupBonus)
  57.                     else
  58.                         mp := SATNewSprite(-4, gSAT.offSizeH, SATRand(gSAT.offSizeV - 64) + 32, @SetupBonus);
  59.             end
  60.         else
  61.             levelCompleted := false;
  62.  
  63.         me^.mode := me^.mode + 1;
  64.         if me^.mode = 5 then
  65.             me^.mode := 1;
  66.         me^.face := heartFace[me^.mode];
  67.  
  68.         me^.position.h := me^.position.h + me^.speed.h;
  69.         me^.position.v := me^.position.v + me^.speed.v;
  70.  
  71.         if me^.position.h < 0 then
  72.             begin
  73.                 me^.position.h := 0;
  74.                 me^.speed.h := -me^.speed.h;
  75.                 me^.speed.v := me^.speed.v + SATRand(3) - 2;
  76.             end;
  77.         if me^.position.h > gSAT.offSizeH - xsize then
  78.             begin
  79.                 me^.position.h := gSAT.offSizeH - xsize;
  80.                 me^.speed.h := -me^.speed.h;
  81.                 me^.speed.v := me^.speed.v + SATRand(3) - 2;
  82.             end;
  83.         if me^.position.v < 0 then
  84.             begin
  85.                 me^.position.v := 0;
  86.                 me^.speed.v := -me^.speed.v;
  87.                 me^.speed.h := me^.speed.h + SATRand(3) - 2;
  88.             end;
  89.         if me^.position.v > gSAT.offSizeV - 32 then
  90.             begin
  91.                 me^.position.v := gSAT.offSizeV - 32;
  92.                 me^.speed.v := -me^.speed.v;
  93.                 me^.speed.h := me^.speed.h + SATRand(3) - 2;
  94.             end;
  95. { It shouldn't be totally still! }
  96.         if (me^.speed.v = 0) and (me^.speed.h = 0) then
  97.             begin
  98.                 me^.speed.h := SATRand(7) - 4;
  99.                 me^.speed.v := SATRand(7) - 4;
  100.             end;
  101.  
  102.     end; {HandleHeart}
  103.  
  104.  
  105.     procedure HandleBonusHeart (me: SpritePtr);
  106.         var
  107.             mp: SpritePtr;
  108.     begin
  109.         if me^.kind <> -2 then
  110.             begin
  111.                 me^.task := nil;
  112.                 AddScore(10);
  113.                 SATSoundPlay(plinkSndH, 1, false);
  114.             end
  115.         else
  116.             levelCompleted := false;
  117.  
  118.         me^.mode := me^.mode + 1;
  119.         if me^.mode = 5 then
  120.             me^.mode := 1;
  121.         me^.face := heartFace[me^.mode];
  122.  
  123.         me^.position.h := me^.position.h + me^.speed.h;
  124.         me^.position.v := me^.position.v + me^.speed.v;
  125.  
  126.         if me^.position.h > gSAT.offSizeH - xsize then
  127.             begin
  128.                 me^.position.h := gSAT.offSizeH - xsize;
  129.                 me^.speed.h := -me^.speed.h;
  130.                 me^.speed.v := me^.speed.v + SATRand(3) - 2;
  131.             end;
  132.         if me^.position.h < 0 then
  133.             begin
  134.                 me^.position.h := 0;
  135.                 me^.speed.h := -me^.speed.h;
  136.                 me^.speed.v := me^.speed.v + SATRand(3) - 2;
  137.             end;
  138.         if me^.position.v > gSAT.offSizeV then
  139.             begin
  140.                 me^.task := nil;
  141.                 gotAllBonuses := false;
  142.                 SATSoundPlay(miuiuH, 1, true);
  143.             end;
  144.  
  145. { It shouldn't be totally still! }
  146.         if me^.speed.v <= 0 then
  147.             me^.speed.v := SATRand(3) + 3; {Alltid positiv!}
  148.  
  149.     end; {HandleBonusHeart}
  150.  
  151.     procedure SetupHeart (mp: SpritePtr);
  152.     begin
  153.         mp^.face := heartFace[1];
  154.         mp^.mode := SATRand(4) + 1; { ikonnummer }
  155.         SetRect(mp^.hotRect, -5 + 16, -15 + 32, 5 + 16, -5 + 32);
  156.         mp^.speed.h := SATRand(7) - 4;
  157.         mp^.speed.v := SATRand(7) - 4;
  158.         sofar := 0;
  159.         mp^.task := @HandleHeart; {default}
  160.     end;
  161.  
  162.     procedure SetupBonusHeart (mp: SpritePtr);
  163.     begin
  164.         mp^.face := heartFace[1];
  165.         mp^.mode := SATRand(4) + 1; { ikonnummer }
  166.         SetRect(mp^.hotRect, -5 + 16, -15 + 32, 5 + 16, -5 + 32);
  167.         mp^.speed.h := SATRand(7) - 4;
  168.         sofar := 0;
  169.  
  170.         mp^.task := @HandleBonusHeart;
  171.         mp^.speed.v := SATRand(5) + 2 - mp^.position.v div 100; {Alltid positiv! Stor negativ position ger större fart!}
  172.     end;
  173.  
  174.  
  175. end.